#include "my_key.h"

/////////////////////////////////////////////////////////////
/*  通过按键按下时长置不同标志位，在使用后标志位清0实现按键长按短按判断  */

//可以实现单击（短按），长按一直加，长按抬起后执行，双击

struct keys key[5]={0,0,0,0};
void key_serv(void)//将该函数放到10ms进入一次的定时器中断里执行
{
    //获取按键状态-是否按下
    key[0].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9);
    key[1].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8);
    key[2].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7);
    //key[3].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12);
    
    for(uint8_t i = 0;i < 3;i ++)//按键依次执行，共4个按键，所以i<4
    {
        switch (key[i].judge_sta)//用状态机写按键状态
        {
            case 0:
            {
                if(key[i].key_sta == 0)//如果按键按下
                {
                    key[i].judge_sta = 1;                
                }
                key[i].key_time = 0;//按键按下准备计时，但还没开始，因为要消抖                   
            }
            break;
            
            case 1:
            {
                if(key[i].key_sta == 0)//如果此时按键还按下则跳转到状态2，否则回到状态0，起到消抖作用
                {
                    key[i].judge_sta = 2;            
                }
                else
                {
                    key[i].judge_sta = 0;                
                }           
            }
            break;
            
            case 2:
            {
                if(key[i].key_sta == 0)//如果此时还按下
                {
                    key[i].key_time ++;//计时
                    if(key[i].key_time > 70)
                    {
                        key[i].long_flag = 1;//长按700ms，长按标志位置1                      
                    }
                }
                else
                {
//                    if(key[i].key_sta == 1)//如果此时松开
//                    {
//                        key[i].judge_sta = 0;//回到初始状态
//                        if(key[i].key_time < 70)//如果按下<70ms，单击标志位置1
//                        {
//                            key[i].single_flag = 1;
//                        }
//                    }        
                    if(key[i].key_sta == 1)//松开之后判断按下的时间
                    {
                        if(key[i].key_time < 70)
                        {
                            switch (key[i].key_double_judge)
                            {
                                case 0:
                                    key[i].key_double_judge = 1;
                                    key[i].key_double_time = 0;//计时归0
                                    break;
                                
                                case 1:
                                  key[i].double_flag = 1;
                                  key[i].key_double_judge = 0;
                                    break;                                                         
                            }                                                    
                        }   
                     key[i].judge_sta = 0;  
                    }                   
                }           
            }
            break;        
        }   
        
        if(key[i].key_double_judge == 1)//按键按下时间<70ms时，判断是单击还是双击
        {
            key[i].key_double_time ++;//开始双击计时
            if(key[i].key_double_time >=35)//双击时间阈值为350ms
            {
                key[i].single_flag = 1;//如果超过双击时间阈值，就判断为单击
                key[i].key_double_judge = 0;
            }        
        }       
            
        if((key[i].long_flag == 1)&&(key[i].key_sta == 1))/*长按抬起后执行*/
        {
        key[i].long_least_flag = 1;  
        key[i].long_flag =0;
        }
    }    
}
//////////////////////////////////////////////////////////////////////////



